import json
import logging
import time
import json
from mcp_server_graph.llm.agent import BaseAgent

"""意图识别智能体，负责将用户的意图识别为具体业务场景需求
input: str
output: {"purpose": int, "reason": str, "values": dict}
"""

purpose_info =[
    {"id": 0, "name": "人车家", 
     "description": """人车家业务场景相关的用户意图，用户问题可能涉及购车、用车等相关信息。
     此意图的关键词包括但不限于：购车、用车、4S店、汽车服务等。
     """
    },
    {"id": 1, "name": "异网用户发展", 
    "description": """异网拉新场景相关的用户意图，用户问题可能涉及新用户发展、异网用户识别等信息。
    此意图的关键词包括但不限于：异网、拉新、用户发展等。
    """
    },
    {"id": 2, "name": "群体运营", 
    "description": """存量用户群体运营场景相关的用户意图，用户问题可能涉及存量用户群体关系的识别和运营策略的制定。
    此意图的关键词包括但不限于：存量用户、群体运营、用户群体等。
    """
    },
    {"id": 3, "name": "诈骗识别", 
    "description": """诈骗识别场景相关的用户意图，用户问题可能涉及诈骗用户的识别和分析。
    此意图的关键词包括但不限于：诈骗、识别、异常行为等。
    """
    },
    {"id": 4, "name": "集团产品推荐", 
    "description": """集团产品推荐场景相关的用户意图，用户问题可能涉及向企业推荐产品。
    此意图的关键词包括但不限于：集团用户、集团订购、集团产品。
    """
    },
    {"id": 5, "name": "其他", 
    "description": """其他意图，无法归类到上述任何一个场景的用户意图。
    其他场景可能包括但不限于：直接查询、数据统计、用户行为分析等。
    """
    }
] 

ret_json_info="""
{
"purpose": 0,
"reason": "",
"values": {}
}
其中，"purpose"表示用户意图选项，"reason"表示意图判断依据，"values"表示后续cypher查询所需的相关信息（如城市名或群体id等）
"""

few_shot_examples = """
# question: 帮我找出北京地区经常去4S店，可能有购车意向的用户
# answer: {
            "purpose": 0,
            "reason": "用户询问识别经常访问4S店的潜在购车用户，符合人车家业务场景",
            "values": {
            }
        }

# question: 基于海淀区校园用户的特点，进行异网用户拉新
# answer: {
            "purpose": 1,
            "reason": "用户要求通过特定用户群体识别异网用户进行拉新",
            "values": {
            }
        }

# question: 日间常驻海淀区科技公司附近的用户群体中，哪些人资费明显低于其他人，请给出营销建议
# answer: {
            "purpose": 2,
            "reason": "用户要求识别特定群体内资费较低的用户并制定营销策略，符合群体运营场景",
            "values": {
            }
        }

# question: 帮我筛查最近一周有大量短时长国际通话的新入网用户，识别诈骗风险
# answer: {
            "purpose": 3,
            "reason": "用户要求识别具有典型诈骗特征的通话行为，包括短时长国际通话和高主叫比例",
            "values": {
            }
        }

# question: 查询集团用户群体中个人订购较多的产品，并发掘产品的潜在合作企业，制定推荐策略
# answer: {
            "purpose": 4,
            "reason": "用户要求基于集团用户产品使用行为进行用户细分并制定营销策略",
            "values": {
            }
        }

# question: 查询用户U02369的二度关系网络，识别高价值用户，并给出营销策略
# answer: {
            "purpose": 5,
            "reason": "用户意图无法归类到任何一个场景，属于其他意图",
            "values": {}
        }
"""

class PurposeAgent(BaseAgent):

    def get_system_prompt(self):
        prompt = f"""
        你是一个用户意图识别专家，擅长分析用户对话，能够准确地提炼出用户的意图。
        作为一个数据问答系统的关键组件，你的任务是识别用户输入中的意图，并将其归属到某一预先设定的业务场景，最终按既定的json格式进行输出。
        请学习【background】部分了解任务背景，严格遵循【requirements】部分的要求，并参考【examples】部分提供了几个典型的例子，依照【Instruction】按步骤完成任务。

        【background】
        你所服务的系统是结合图计算与大模型的通用性大数据洞察分析和决策辅助系统。
        该系统接入某电信运营商数据仓库，获取大量业务数据并建立以自然人为中心的知识图谱，如用户入网信息、集团订购产品、流量行为、通话行为、宽带办理信息等
        旨在支撑"建设基于用户细分、存增一体的客户全生命周期数智营销平台，构建以“泛家庭”为单位的融合经营体系"战略任务。
        本系统的工作流程为：
        首先调用大模型A对用户原始输入进行意图识别，划分到预定义的业务场景，并生成其他相关信息（这是你所负责的部分）；
        然后进入细分场景下预定义的cypher查询模版，接收大模型A生成的cypher参数，获取与用户问题相关的数据；
        最后查询结果和用户原始输入给到大模型B，生成最终的自然语言回答。
        
        
        【Instruction】
        1、分析用户对话，识别用户意图
        2、根据用户意图，从【requirements】中预定义选项选出符合用户意图的单个结果
        3、生成用户意图判断依据，保存在"reason"中
        4、提取用户输入中可以作为后续cypher查询的作为参数的信息，以字典的形式保存在"values"中
        5、按【requirements】中要求的格式生成json对象

        【requirements】
        1、返回格式请严格按照如下json格式: {ret_json_info},务必保证后续代码可以解析，不要附加其他无关内容

        2、意图选项严格遵循{purpose_info}中所示信息，返回的"purpose"字段值必须是0-5之间的整数，表示对应的意图选项

        【examples】
        {few_shot_examples}
        """

        return prompt
    
    def purpose_chat(self,user_prompt,history=None):
        
        res=None

        try:
            response = self.complete(user_prompt,history=history)
            res=response.choices[0].message.content
            print(res)
        except Exception as e:
            res = """
                {
                    "purpose": -1,
                    "reason": "发生错误",
                    "values": {}
                }
            """

        finally:
            ret=json.loads(res.removeprefix("```json").removesuffix("```"))
            ret.update({"user_input": user_prompt})
            return ret
    
    def purpose_chat_stream(self, user_prompt, messages):
        try:
            start_time = time.time()
            response = self.stream_complete(user_prompt, messages)
            collected_chunks = []
            collected_messages = []
            # 通过事件流迭代
            for chunk in response:
                chunk_time = time.time() - start_time
                collected_chunks.append(chunk)
                chunk_message = chunk.choices[0].delta
                collected_messages.append(chunk_message)
                # print(f"Message received {chunk_time:.2f} seconds after request: {chunk_message}")
            #     print(chunk.choices[0].delta.content, end='')
            #
            # print()

            # 打印完整响应和文本
            full_reply_content = ''.join([m.content for m in collected_messages])
            logging.info(f"Full conversation received: {full_reply_content}")
            return json.loads(full_reply_content.removeprefix("```json").removesuffix("```"))
        except Exception as e:
            final_response = "对不起，我现在有点问题，请尝试问另外一个问题"

        print(final_response)
        return {
                    "question": user_prompt,
                    "reason": "",
                    "purpose": -1,
                    "value": []
        }





if __name__ == '__main__':
    agent = PurposeAgent()
    response1 = agent.purpose_chat("查询全部集团用户订购的产品，给出营销建议")

    print(response1)